package com.smart.community.feign.property.fallback;

import com.smart.community.feign.property.dto.PropertyCompanyPaymentInfoDTO;
import com.smart.community.feign.property.service.IPropertyCompanyPaymentFeign;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 物业公司支付Feign降级处理工厂
 * 
 * 当物业服务不可用时，提供安全的降级处理：
 * 1. 返回安全的默认值，避免调用方异常
 * 2. 记录详细的错误日志，便于问题排查
 * 3. 确保缴费系统稳定性，避免因物业服务异常导致缴费功能完全不可用
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-01-30
 */
@Slf4j
@Component
public class PropertyCompanyPaymentFeignFallbackFactory implements FallbackFactory<IPropertyCompanyPaymentFeign> {
    
    @Override
    public IPropertyCompanyPaymentFeign create(Throwable cause) {
        return new IPropertyCompanyPaymentFeign() {
            
            @Override
            public PropertyCompanyPaymentInfoDTO getPropertyCompanyPaymentInfo(Long propertyCompanyId) {
                log.error("获取物业公司支付信息失败，物业公司ID: {}, 错误信息: {}", propertyCompanyId, cause.getMessage(), cause);
                
                // 返回默认的支付信息，避免调用方异常
                PropertyCompanyPaymentInfoDTO defaultInfo = new PropertyCompanyPaymentInfoDTO();
                defaultInfo.setPropertyCompanyId(propertyCompanyId);
                defaultInfo.setCompanyName("物业公司");
                defaultInfo.setCompanyCode("DEFAULT");
                defaultInfo.setOnlinePaymentEnabled(false);
                defaultInfo.setQrCodePaymentEnabled(false);
                defaultInfo.setPaymentDescription("支付服务暂时不可用，请联系物业公司");
                
                log.warn("返回默认物业公司支付信息，物业公司ID: {}", propertyCompanyId);
                return defaultInfo;
            }
            
            @Override
            public PropertyCompanyPaymentInfoDTO getPaymentInfoByHouseholdId(Long householdId) {
                log.error("根据房户ID获取支付信息失败，房户ID: {}, 错误信息: {}", householdId, cause.getMessage(), cause);
                
                // 返回默认的支付信息，避免调用方异常
                PropertyCompanyPaymentInfoDTO defaultInfo = new PropertyCompanyPaymentInfoDTO();
                defaultInfo.setPropertyCompanyId(null);
                defaultInfo.setCompanyName("物业公司");
                defaultInfo.setCompanyCode("DEFAULT");
                defaultInfo.setOnlinePaymentEnabled(false);
                defaultInfo.setQrCodePaymentEnabled(false);
                defaultInfo.setPaymentDescription("支付服务暂时不可用，请联系物业公司");
                
                log.warn("返回默认支付信息，房户ID: {}", householdId);
                return defaultInfo;
            }
            
            @Override
            public Map<Long, PropertyCompanyPaymentInfoDTO> getPropertyCompanyPaymentInfoBatch(List<Long> propertyCompanyIds) {
                log.error("批量获取物业公司支付信息失败，物业公司ID列表: {}, 错误信息: {}", propertyCompanyIds, cause.getMessage(), cause);
                
                // 返回空的映射关系，避免调用方异常
                Map<Long, PropertyCompanyPaymentInfoDTO> defaultMap = new HashMap<>();
                
                // 为每个物业公司ID创建默认的支付信息
                for (Long propertyCompanyId : propertyCompanyIds) {
                    PropertyCompanyPaymentInfoDTO defaultInfo = new PropertyCompanyPaymentInfoDTO();
                    defaultInfo.setPropertyCompanyId(propertyCompanyId);
                    defaultInfo.setCompanyName("物业公司");
                    defaultInfo.setCompanyCode("DEFAULT");
                    defaultInfo.setOnlinePaymentEnabled(false);
                    defaultInfo.setQrCodePaymentEnabled(false);
                    defaultInfo.setPaymentDescription("支付服务暂时不可用，请联系物业公司");
                    
                    defaultMap.put(propertyCompanyId, defaultInfo);
                }
                
                log.warn("返回默认批量支付信息，物业公司ID数量: {}", propertyCompanyIds.size());
                return defaultMap;
            }
        };
    }
}
